package com.xwj.config;

import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author xwj
 * @date 2020/4/14
 */
@Configuration
public class KafkaConfig {
    @Bean
    public NewTopic myTopic() {
        /**
         * 如何保证消息不丢失
         *
         * NewTopic(String name, int numPartitions, short replicationFactor)
         * 为了保证 leader 副本能有 follower 副本能同步消息，我们一般会为 topic 设置 replication.factor >= 3。
         * 这样就可以保证每个 分区(partition) 至少有 3 个副本。虽然造成了数据冗余，但是带来了数据的安全性。
         *
         * 设置 min.insync.replicas > 1
         * 一般情况下我们还需要设置 min.insync.replicas> 1 ，这样配置代表消息至少要被写入到 2 个副本才算是被成功发送。
         * min.insync.replicas 的默认值为 1 ，在实际生产中应尽量避免默认值 1。
         * 但是，为了保证整个 Kafka 服务的高可用性，你需要确保 replication.factor > min.insync.replicas 。
         * 为什么呢？设想一下加入两者相等的话，只要是有一个副本挂掉，整个分区就无法正常工作了。
         * 这明显违反高可用性！一般推荐设置成 replication.factor = min.insync.replicas + 1。
         */
        return new NewTopic("xwj-topic-1", 2, (short) 1);
    }

    @Bean
    public NewTopic myTopic2() {
        return new NewTopic("xwj-topic-2", 1, (short) 1);
    }
}
